/*
  伐木工
  题目描述
    伐木工人米尔科需要砍倒M米长的木材。
    这是一个对米尔科来说很容易的工作，因为他有一个漂亮的新伐木机，可以像野火一样砍倒森林。
    不过，米尔科只被允许砍倒单行树木。

    米尔科的伐木机工作过程如下：
      米尔科设置一个高度参数 H（米），伐木机升起一个巨大的锯片到高度 H，
      并锯掉所有的树比 H 高的部分（当然，树木不高于 H 米的部分保持不变）。
      米尔科就得到树木被锯下的部分。
    例如，
      如果一行树的高度分别为 20，15，10 和 17，米尔科把锯片升到 15 米的高度，
      切割后树木剩下的高度将是 15，15，10 和 15，而米尔科将从第 1 棵树得到 5 米，
      从第 4 棵树得到 2 米，共得到 7 米木材。

    米尔科非常关注生态保护，所以他不会砍掉过多的木材。
    这正是他为什么尽可能高地设定伐木机锯片的原因。
    帮助米尔科找到伐木机锯片的最大的整数高度 H，使得他能得到木材至少为 M 米。
    换句话说，如果再升高 1 米，则他将得不到 M 米木材。
  输入格式
    第 1 行：2 个整数 N 和 M，N 表示树木的数量（1 <= N <= 10^6）, M 表示需要的木材总长度（1 <= M <= 2 ∗ 10^9）
    第 2 行：N 个整数表示每棵树的高度，值均不超过 10^9。所有木材长度之和大于 M，因此必有解。
  输出格式
    1 个整数，表示砍树的最高高度。
  输入数据 1
    5 20
    4 42 40 26 46
  输出数据 1
    36
*/

#include <bits/stdc++.h>

using namespace std;

/*
  思路:
    通常采用二分答案算法的话, 需要首先明确 2 个核心问题:
      1) 答案的取值范围(区间)，即确定区间的最大值和最小值
      2) 判断某个答案是否满足题意(条件)的判定方法
    解答本题时，先明确出这 2 个问题:
      1）答案的取值范围(区间)
          区间的最小值为 0 (所有的树全部砍光, 全部转换成木材);
          区间的最大值为最开始 n 棵树中的最大高度
      2) 判断某个答案是否满足题意的判定方法:
          首先计算出：以该答案(高度)进行砍树，可以得到的木材的总长度；
          如果得到的木材总长度数大于等于 m，则该答案满足题目要求；
          否则，则该答案不满题目要求!
*/

int n, m;
int a[1000005] = {}; // a[i] 表示第 i 棵树的高度 (其中 i > 0)
int s = 0, e = 0;    // s(start) 表示二分答案算法实现中进行二分查找时的开始边界(左边界)
                     // e(end)   表示二分答案算法实现中进行二分查找时的结束边界(右边界)

// 该函数用来判断输入 x(表示答案，即砍树的高度) 是否满足条件(题目要求)
bool cmp(int x) {
    long long sum = 0;  // 得到的木材总长度

    // 如果得到的木材总长度数大于等于 m，则该答案满足题目要求；
    // 否则，则该答案不满题目要求!
    for (int i = 1; i <= n; i++) {
        if (a[i] - x > 0) {
            sum = sum + a[i] - x;
        }
    }

    return sum >= m;
}

int main() {
    cin >> n >> m;
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
        if (e < a[i]) { // 二分查找时结束边界(右边界)，即砍树高度的取值范围(区间)的最大值为 n 颗树中的最高的那棵树的高度
            e = a[i];
        }
    }
    sort(a + 1, a + n + 1);

    /*
      用二分查找法，在答案的区间范围内，查找满足题目要求的最大高度
    */
    s = 0;
    int ans = 0;      // 表示砍树的最大高度 (答案)
    while (s <= e) {
        int mid = (s + e) / 2;
        if (cmp(mid)) {
            ans = mid;
            s = mid + 1;  // 由于需要答案尽可能地大，所以我们进一步从 mid 的右半区间进行查找
        } else {
            e = mid - 1;  // mid 不满足题目要求，从 mid 的左半区间进行查找
        }
    }
    cout << ans;

    return 0;
}